---@class tmr
---https://nodemcu.readthedocs.io/en/release/modules/tmr/
tmr = {
    ---一次报警(不需要调用unregister())
    ALARM_SINGLE = "ALARM_SINGLE",
    ---手动重复报警(调用start()重新启动)
    ALARM_SEMI = "ALARM_SEMI",
    ---自动重复报警
    ALARM_AUTO = "ALARM_AUTO"
}
---@class timer
local timer = {}

---创建一个动态计时器对象
---@return timer
function tmr.create()
end

---对处理器进行指定微秒数的Busyloops。这通常是一个坏主意，因为没有其他东西可以运行，网络堆栈(和其他东西)可能因此崩溃。tmr.delay()唯一适合使用的时间是在处理一个需要命令之间(非常)短暂延迟的外围设备时，或者类似的情况下。小心使用!还要注意，由于时间不准确以及在此期间可能运行的中断，延迟的实际时间量可能明显更大。
---@param us number @用于busyloop的微秒
---@return nil
function tmr.delay(us)
end

---返回以微秒为单位计算的系统计数器。它被限制为31位，之后又回到了0。如果您使用此函数来解除或节流GPIO输入，这是必不可少的。
---@return number
function tmr.now()
end

---提供一个简单的软件看门狗，在它过期之前需要重新武装或禁用它，否则系统将重新启动。
---@param timeout_s number @看门狗超时，单位是秒。要禁用看门狗，请使用-1(或任何其他负值)
---@return nil
function tmr.softwd(timeout_s)
end

---返回系统正常运行时间，以秒为单位。它被限制为31位，之后又回到了0。
---@return number
function tmr.time()
end

---给系统看门狗喂食。
---一般来说，如果您需要使用这个函数，那么您做错了。
---NodeMCU的事件驱动模型意味着不需要坐在硬循环中等待事情发生。相反，只需使用回调在发生某些事情时得到通知。使用这种方法，永远不应该需要手动向系统看门狗提供信息。
---@return nil
function tmr.wdclr()
end

---获取包含CPU节拍的CPU帐户寄存器的值。寄存器是32位的，可以滚动。
---将寄存器的CPU滴答数除以80或160 (CPU80/CPU160)，即tmr.ccount() / node.getcpufreq()。
---与tmr.now()不同，寄存器算术不需要考虑滚动。由于同样的原因，当CCOUNT设置其第32位时，它在Lua中显示为负数。
---@return number
function tmr.ccount()
end

---这是一个方便的函数，将tobj:register()和tobj:start()组合成一个单独的调用。
---这就是为什么这个方法具有与tobj:register()相同的参数的原因。如果在一个已经运行的计时器上调用tobj:alarm()，计时器将被停止，设置新的参数并重新启动计时器(类似于调用tobj:start(true))。
---要释放这个计时器的资源，在它上面调用tobj:unregister()。对于一次性计时器来说，这是没有必要的，除非它们在过期之前被停止。
---@param interval_ms number @定时器间隔(毫秒)。最大值为6870947(1:54:30.947)。
---@param mode tmr.ALARM_SINGLE|tmr.ALARM_SEMI|tmr.ALARM_AUTO
---@param callback fun(timer:self):void 用计时器对象作为参数调用的回调函数
---@return boolean
function timer:alarm(interval_ms, mode, callback)
end

---更改注册计时器的过期时间间隔
---@param interval_ms number 定时器间隔(毫秒)。最大值为6870947(1:54:30.947)。
---@return nil
function timer:interval(interval_ms)
end

---配置一个计时器并注册在到期时调用的回调函数。
---要释放这个计时器的资源，在它上面调用tobj:unregister()。
---对于一次性计时器来说，这是没有必要的，除非它们在过期之前被停止。
---@param interval_ms number @定时器间隔(毫秒)。最大值为6870947(1:54:30.947)。
---@param mode tmr.ALARM_SINGLE|tmr.ALARM_SEMI|tmr.ALARM_AUTO
---@param callback fun(timer):void
---@return nil
function timer:register(interval_ms, mode, callback)
end

---启动或重新启动先前配置的计时器。如果定时器正在运行，只有当restart参数为true时才重启定时器。否则返回false表示信令错误。
---@param restart boolean @可选布尔参数，强制重新启动已经运行的计时器
---@return boolean @如果计时器(重新)启动则为True，错误则为false
function timer:start(restart)
end

---检查定时器的状态。
---@return bool|number|nil @如果指定的计时器已注册，则返回它当前是否启动及其模式。如果计时器未注册，则返回nil。
function timer:state()
end

---停止正在运行的计时器，但不注销它。停止的计时器可以用tobj:start()重新启动。
---@return boolean @如果计时器停止则为True，错误则为false
function timer:stop()
end

---停止计时器(如果运行)并注销关联的回调。
---这对于一次性计时器(tmr.ALARM_SINGLE)来说是不必要的，因为它们在被触发时自动注销自己。
---@return nil
function timer:unregister()
end
